package com.xxx.springboot.service;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xxx.springboot.pojo.entity.User;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author gwq
 * @since 2020-04-26
 */
public interface UserService extends IService<User> {

	User getById(String userId);
	
	// 使用缓存注解
	// value：缓存的名称，也可以换成它的别名：cacheNames。
	// key：缓存的key，可以为空，支持SpEL表达式，如果为空则按照该方法的所有参数组合生成。
	// condition：支持缓存条件，可以为空，支持SpEL表达式，返回 true时才进行缓存，否则每次都会执行该方法。如果为空表示所有场景都会缓存。
	// unless：不支持缓存的条件，和condition相反。可以为空，支持SpEL表达式，返回 true时表示即使缓存里有数据，也会跳过缓存。
	// sync：是否开启同步调用，可以为空，默认为false（不开启），如果为true表示如果同时有多个线程调用该方法时只有1个线程能调用成功，其他线程则是等待这次调用的返回值。
	//       不管sync设置是true还是false，Caffeine默认使用的都是单线程 ：只允许一个线程去加载数据，其余线程阻塞。这样其实也会导致效率低下，用户等待。因此建议配合refreshAfterWrite一起使用：只阻塞加载数据的线程，其余线程返回旧数据。
	@Cacheable(value = "users", key = "#username", condition="#username.length()>10")
	User getByName(String username);
	
	// 添加缓存
	@CachePut(value = "users", key = "#userId")
	int saveUser(User user);
	
	// 驱逐缓存（清除缓存、淘汰缓存）
	@CacheEvict(value = "users", key = "#userId")
	boolean deleteUserById(String userId);
	
}
